package com.dmz.proxy.util;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;

import java.util.regex.Pattern;

/**
 * 安全验证工具类
 */
@Component
@Slf4j
public class SecurityValidator {
    
    // 安全路径正则：只允许字母、数字、下划线、连字符和斜杠
    private static final Pattern SAFE_PATH_PATTERN = Pattern.compile("^[a-zA-Z0-9_\\-/]*$");
    
    // 安全URL正则：限制允许的字符
    private static final Pattern SAFE_URL_PATTERN = Pattern.compile("^[a-zA-Z0-9:/._\\-?=&]*$");
    
    // 最大URL长度限制
    private static final int MAX_URL_LENGTH = 1000;
    
    // 最大请求体大小限制（10MB）
    private static final int MAX_BODY_SIZE = 10 * 1024 * 1024;
    
    /**
     * 验证路径是否安全
     */
    public boolean isValidPath(String path) {
        if (!StringUtils.hasText(path)) {
            return false;
        }
        
        // 检查路径长度
        if (path.length() > 500) {
            log.warn("Path too long: {}", path);
            return false;
        }
        
        // 检查路径格式
        return SAFE_PATH_PATTERN.matcher(path).matches();
    }
    
    /**
     * 验证URL是否安全
     */
    public boolean isValidUrl(String url) {
        if (!StringUtils.hasText(url)) {
            return false;
        }
        
        // 检查URL长度
        if (url.length() > MAX_URL_LENGTH) {
            log.warn("URL too long: {}", url.length());
            return false;
        }
        
        // 检查URL格式
        if (!SAFE_URL_PATTERN.matcher(url).matches()) {
            log.warn("Invalid URL format: {}", url);
            return false;
        }
        
        return true;
    }
    
    /**
     * 验证请求体大小
     */
    public boolean isValidBodySize(String body) {
        if (body == null) {
            return true;
        }
        
        return body.length() <= MAX_BODY_SIZE;
    }
    
    /**
     * 检查内容类型是否安全
     */
    public boolean isSafeContentType(String contentType) {
        if (!StringUtils.hasText(contentType)) {
            return false;
        }
        
        String lowerContentType = contentType.toLowerCase();
        
        // 允许的安全内容类型
        return lowerContentType.startsWith("application/json") ||
               lowerContentType.startsWith("text/plain") ||
               lowerContentType.startsWith("application/xml") ||
               lowerContentType.startsWith("text/xml") ||
               lowerContentType.startsWith("image/") ||
               lowerContentType.startsWith("application/octet-stream") ||
               lowerContentType.contains("charset=utf-8");
    }
    
    /**
     * HTML转义，防止XSS
     */
    public String escapeHtml(String text) {
        if (text == null) {
            return "";
        }
        
        return text.replace("&", "&amp;")
                  .replace("<", "&lt;")
                  .replace(">", "&gt;")
                  .replace("\"", "&quot;")
                  .replace("'", "&#x27;")
                  .replace("/", "&#x2F;");
    }
    
    /**
     * 对JSON响应进行安全处理
     */
    public String sanitizeJsonResponse(String json) {
        if (!StringUtils.hasText(json)) {
            return json;
        }
        
        // 简单的JSON内容检查，防止注入恶意脚本
        if (json.contains("<script") || json.contains("javascript:") || json.contains("onload=")) {
            log.warn("Potential XSS content detected in JSON response");
            // 返回安全的错误响应
            return "{\"error\":\"Security validation failed\"}";
        }
        
        return json;
    }
}